为什么redo log有两阶段提交?

2 分钟阅读 328 字 + 195 词
首先是为了 保证redo log和bin log之间的逻辑一致。
事务提交后,redo log 和bin log都要持久化到磁盘,但是这两个是独立的逻辑,可能出现半成功的状态,这样就造成两份日志之间的逻辑不一致。
我们可以用反证的方式,如果采用以下操作:
  • 先写redo log再写bin log:假设在redo log写完,bin log还没有写完的时候,mysql挂掉了。然后系统重启通过redo log进行数据恢复,但是这个时候bin log中是没有这个数据的。所以如果要用bin log来恢复临时库的话,这个库就会少了这次更新。
  • 先写bin log再写redo log:假设在bin log写完,mysql挂掉了。然后系统重启通过bin log进行数据恢复,但是这个时候redo log中是没有这个数据的。所以使用bin log来恢复的话就会多出一次事务。
所以 不用两阶段提交的话,数据库的状态和它用日志恢复的库的状态就会不一致。
分为三个时间点
1 redolog的 prepare阶段 2 写binlog 3 redolog的 commit
当在2之前崩溃时 重启恢复:后 发现没有commit,回滚 。备份恢复:没有binlog 。 此时也是一致的
当在3之前崩溃 重启恢复: 虽没有commit,但满足prepare和binlog完整 ,所以 重启后会自动commit 。备份:有binlog. 是一致的

目录